package com.itany.corejava.util;

/**
 * @author MissChen
 * @date 2024年03月08日 16:52
 */

import java.io.*;

/**
 * 定义一个文件工具类FileUtil
 * 1.将一个文件中的内容拷贝到一份指定的文件中(2个参数)
 * 2.将一个目录中的文件拷贝到指定目录中(2个参数)
 * 3.将一个目录中的文件与子目录递归拷贝到一个指定的目录中
 * <p>
 * 在工具类中新增一个方法
 * 1.拆分文件，将一个文件按照指定大小拆分成多个文件，每一个文件名字为:原名字_index，index从1开始，每次自增1
 * 一个输入流，多个输出流，在输出时，每循环一次，输出一个子文件
 * 2.合并文件，将之前拆分的文件合并为一个文件，将文件的_index部分删除作为文件名
 * 一个输出流，多个输入流
 */
public class FileUtil {

    /**
     * 拷贝文件内容
     * @param src    源文件
     * @param target 目标文件
     */
    public static void copyFile(File src, File target) {
        try (
                //文件输入流,将src中的内容读取
                InputStream in = new FileInputStream(src);
                //文件输出流，将内容写入target中
                OutputStream out = new FileOutputStream(target);
        ) {
            byte[] b = new byte[1024];
            int i = -1;
            while ((i = in.read(b)) != -1) {
                out.write(b, 0, i);
            }


        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 拷贝文件内容
     * @param src    源文件
     * @param target 目标文件
     */
    public static void copyFile(String src, String target) {
        copyFile(new File(src), new File(target));
    }

    /**
     * 将一个目录中的文件拷贝到指定目录中
     * @param src    源目录
     * @param target 目标目录
     */
    public static void copyDirectory(String src, String target) {
        File fileSrc = new File(src);

        //获取源目录中的所有的文件和文件夹
        File[] files = fileSrc.listFiles();

        //创建目标目录
        File fileTarget = new File(target);
        fileTarget.mkdir();
        for (File file : files) {
            if (file.isFile()) {//判断是否是文件

                copyFile(file, new File(target + file.separator + file.getName()));
            }
        }


    }
    public static void recursionCopy(String src,String target){
        File srcFile=new File(src);
        //获取该目录中所有的文件夹和文件
        File[] files=srcFile.listFiles();

        File targetFile=new File(target);
        // 创建目标目录
        targetFile.mkdirs();

        //遍历所有子文件
        for(File file:files){
            // 如果是子目录
            if(file.isDirectory()){
                recursionCopy(file.getAbsolutePath(),target+file.separator+file.getName());
            }else{
                //如果是文件，则直接复制
                copyFile(file,new File(target,file.getName()));
            }
        }

    }





    /**
     * 拆分文件，将一个文件按照指定大小拆分成多个文件
     * @param path
     * @param length
     */
    public static void splitFile(String path, int length) {
        FileInputStream in = null;
        FileOutputStream out = null;
        try {
            in = new FileInputStream(path);

            //设置每次读取的字节数
            byte[] b = new byte[length];
            int i = -1;
            int index = 1;
            while ((i = in.read(b)) != -1) {
                out = new FileOutputStream(path + "_" + index++);
                out.write(b, 0, i);
                out.close();
            }


        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (in != null) {
                    in.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 合并文件
     * @param firstFile 第一个文件对象
     */
    public static void mergeFile(File firstFile) {
        FileOutputStream out = null;
        try {
            //获取文件的绝对路径
            String path = firstFile.getAbsolutePath();

            //将传入的文件路径中包含_后面的数字进行清除
            path = path.substring(0, path.lastIndexOf("_"));//[start,end)

            //定义一个输出流
            out = new FileOutputStream(path);
            //定义所有合并的子文件的后缀数字
            int index = 1;
            File file = null;
            while ((file = new File(path + "_" + index++)).exists()) {
                //定义多个文件字节输入流
                FileInputStream in = new FileInputStream(file);
                copyStream(in, out);

                //关闭当前开启的输入流
                in.close();
                System.out.println(file.getAbsoluteFile() + "合并成功");
            }


        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (out != null) {
                    out.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

    public static void copyStream(FileInputStream in, FileOutputStream out) throws IOException {
        byte[] b = new byte[1024];
        int i = -1;
        while ((i = in.read(b)) != -1) {
            out.write(b, 0, i);
        }

    }
}
